import "reflect-metadata"
import { InversifyExpressServer } from 'inversify-express-utils'   // express跟inversify一起了
import { Container } from 'inversify'       // 依赖注入需要容器
import express from 'express'
import { PrismaClient } from '@prisma/client'

import { UserService } from './src/user/services'
import { UserController } from './src/user/controller'
import { PrismaDB } from './src/db'

// jwt
import { JWT } from "./src/jwt"

const container = new Container()
// 将controller、service等各模块在这里注入
// 注入
container.bind(UserService).to(UserService)
container.bind(UserController).to(UserController)

/**
 * 封装PrismaClient，使用注入工厂
 */
container.bind<PrismaClient>('PrismaClient').toFactory(() => {
    return () => {
        return new PrismaClient()
    }
})
container.bind(PrismaDB).to(PrismaDB)   // 注入

/**
 * 注入jwt
 */
container.bind(JWT).to(JWT)

const server = new InversifyExpressServer(container)  // 建立这个容器的服务
// 写express的中间件
server.setConfig(app => {
    app.use(express.json())
    app.use(container.get(JWT).init)  // 跟express关联 container.get(JWT)：从容器中获取JWT这个类
})
const app = server.build()  // 开启服务


app.listen(3000, () => {
    console.log("服务启动成功，访问 http://localhost:3000");
    
})
